Type Level Domain Modeling
型のみでDomain Modelingをする
UMLなどの外部のツールを使用せずに、仕様と実装を直接管理できる
non developperであるDomain Expertもこれを見てレビューする
ドメイン記述ミニ言語を元に作っていく感じ #??
ユビキタス言語で名詞になるもの
primitive typeで表現できるような概念はnewtypeなどで定義する
ユビキタス言語的には、stringのような概念は無いので逐一それ用の型を用意しようという話
その組み合わせの概念は、直和や直積の形で型を定義する
code:hs
data OrderQuantity = UnitQuantity Unit
| KilogramQuantity Kilogram
現時点で不明な型がある場合
とりあえず明示的にUndefined型にしておき、わかった時点で書き換える
F#ならexn型を使用して、type Undefined = exn型を作る
これで型レベルでの静的検査には通過できる
が、実装時には無理になるので、そのタイミングにでもUndefinedを別のものに替える
例えば、ShippingAddressとBillingAddressのような型が現れた時
これらの型の中身が同じものなのかどうかはDomain Expertに訊く
彼が別物といえば、全く同じ構造であっても、別物として定義しておく
ユビキタス言語で動詞になるもの
ドメインの処理の流れを図示する
関数型で定義する
code:fs
type ValidateOrder = UnvalidateOrder -> ValidatedOrder
これ簡単そうに見えて難しいよなmrsekut.icon
選ぶ動詞がかなり適切でないとミスる
右辺に来るものが「何の」状態を表しているのかを明確にわかるものにしていないといけない
出力が複数ある場合は直積、直和で表現する
副作用を関数型で表現する
失敗の可能性がある場合はResult型を使用する
非同期処理の場合はAsync型を使用する
複合したやつはこんな感じ
code:ex.fs
type ValidateOrder =
UnvalidatedOrder -> Async<Result<ValidateOrder, ValidationError list>>
仕様を満たした型を定義することで、必要なtestの量を減らす
参考
/mrsekut-book-4048931164/085: 第5章 型によるドメインモデリング~